package me.yricky.alia.ui

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import me.yricky.alia.ui.layoutPage.LayoutPageViewModel
import kotlin.reflect.KProperty

/**
 * @author Yricky
 * @date 2022/1/30
 */
abstract class StateViewModel<T> {
    abstract fun initState():T
    protected val _viewState: MutableStateFlow<T> by lazy{
        MutableStateFlow(initState())
    }
    val viewState by lazy{ _viewState.asStateFlow() }
    protected val coroutineScope: CoroutineScope = CoroutineScope(Dispatchers.Default)
}

/**
 * ViewState类中的每一个条目应该都是不可变的，如果其中包含可变类（如集合），
 * 那么更改可变集合时由于外部无法感知到集合内部的变化，因此不会触发
 * 视图更新，此时可以使用这个类将可变类包装起来，并在发生变化时更新这个
 * 类，保持其value不变，即可达到更新视图的效果。
 *
 * 推荐仅在不变类的拷贝成为性能瓶颈时使用该类。
 */
class Wrapper<T>(val value:T){
    fun update():Wrapper<T> = Wrapper(value)
}